package file;

import java.io.*;

/**
 *JAVA IO将流分为节点流与处理流
 *  * 节点流:也称为低级流，是实际连接程序与另一端的“管道”,负责实际读写数据的流。
 *  * 处理流:也称为高级流，不能独立存在，必须连接在其他流上，目的是当数据经过它时对
 *  *       数据进行某种加工，简化我们的同等操作。
 *  * 实际开发中，我们总是串联一组高级流到某个低级流上完成流水线式的读写操作，这个过程
 *  * 被称为"流的连接"。
 *  * 注意:读写一定是建立在节点流上进行的，读写不一定需要处理流，使用处理流是为了简化
 *  * 我们操作。
 *  *
 *  *
 *  * 缓冲流
 *  * java.io.BufferedInputStream和BufferedOutputStream
 *  * 它们也继承自InputStream和OutputStream
 *  *
 *  * 功能:缓冲流可以保证读写效率
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("R-C.jpg");
        /*
            缓冲流内部有一个默认8bk长度的字节数组。
            使用缓冲流读写数据时，其一定会转换为以8kb作为单位进行块读写来保证读写效率

            缓冲区大小可调
         */
//        BufferedInputStream bis = new BufferedInputStream(fis);//默认缓冲区8kb
        BufferedInputStream bis = new BufferedInputStream(fis,1024*10);//自行指定为10kb

        FileOutputStream fos = new FileOutputStream("R-C1.jpg");
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        int d;
        long start = System.currentTimeMillis();
        /*
            缓冲的read方法虽然也是读取一个字节。但是本质上当第一次调用时他会向其
            连接的流一次性块读一组字节回来并存入到内部维护的字节数组中(buf上，默认8kb)
            然后将数组第一个字节返回。
            如果再次调用read方法则直接将字节数组中第二个字节返回，依次类推。
            再次过程中并不会再次读取硬盘，直到所有字节全部返回后，才会再次真实读取。
         */
        while((d = bis.read())!=-1){
            bos.write(d);
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕，耗时:"+(end-start)+"ms");
        bis.close();
        bos.close();



    }
}
